博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初识react高阶组件
阅读量:6172 次
发布时间:2019-06-21

本文共 3868 字,大约阅读时间需要 12 分钟。

前言

最近一直再做数据可视化,业务的理解,数据的理解确实如数据可视化要求的一样,有了更多的理解。但是技术上还停留在echart,Hchart, 画图上。正好一个机会,看了。对大数据有了更深的了解。也明确了大数据时代,前端所应该具备的职业素养

高阶组件

高阶组件HOC(Higher Order Component,高阶组件)就是一个 React 组件包裹着另外一个 React 组件

React 中两种 HOC 的实现方法

React 中两种 HOC 的实现方法:Props Proxy (PP) and Inheritance Inversion (II)

## Props Proxy (PP)

function ppHOC(WrappedComponent) { return class PP extends React.Component {   render() {     return 
} }}

## Inheritance Inversion (II)

function iiHOC(WrappedComponent) { return class Enhancer extends WrappedComponent {   render() {     return super.render()   } }}
返回的 HOC 类(Enhancer)继承了 WrappedComponent。之所以被称为 Inheritance Inversion 是因为 WrappedComponent 被 Enhancer 继承了,而不是 WrappedComponent 继承了 Enhancer。在这种方式中,它们的关系看上去被反转(inverse)了。

Inheritance Inversion 允许 HOC 通过 this 访问到 WrappedComponent,意味着它可以访问到 state、props、组件生命周期方法和 render 方法

一致化处理(Reconciliation process)

一致化处理(Reconciliation)包括的就是React元素的比较以及对应的React元素不同时对DOM的更新,即可理解为React 内部将虚拟 DOM 同步更新到真实 DOM 的过程,包括新旧虚拟 DOM 的比较及计算最小 DOM 操作。

这很重要,意味着 Inheritance Inversion 的高阶组件不一定会解析完整子树

Inheritance Inversion 作用

  • 渲染劫持(Render Highjacking)
  • 操作 state

渲染劫持(Render Highjacking)

  • 在由 render输出的任何 React 元素中读取、添加、编辑、删除 props
export function IIHOCDEBUGGER(WrappedComponent) {  return class II extends WrappedComponent {    render() {      return (        

HOC Debugger Component

Props

{JSON.stringify(this.props, null, 2)}

State

{JSON.stringify(this.state, null, 2)}
{super.render()}
) } }}
  • 读取和修改由 render 输出的 React 元素树
function iiHOC(WrappedComponent) {  return class Enhancer extends WrappedComponent {    render() {      const elementsTree = super.render()      let newProps = {};      if (elementsTree && elementsTree.type === 'input') {        newProps = {value: 'may the force be with you'}      }      const props = Object.assign({}, elementsTree.props, newProps)      const newElementsTree = React.cloneElement(elementsTree, props, elementsTree.props.children)      return newElementsTree    }  }}
  • 有条件地渲染元素树
function iiHOC(WrappedComponent) {  return class Enhancer extends WrappedComponent {    render() {      if (this.props.loggedIn) {        return super.render()      } else {        return null      }    }  }}
  • 把样式包裹进元素树(就像在 Props Proxy 中的那样)

高阶组件例子

// app.jsimport React, {Component} from 'react';import logo from './logo.svg';import './App.css';import Auth from './auth';// 发帖组件class Btn extends Component {    send() {        alert('发帖子');    }    render() {        return (                    )    }}// 喜欢组件class BtnLike extends Component {    send() {        alert('喜欢');    }    render() {        return (                    )    }}class App extends Component {    render() {        // 高阶组件Auth()        let AuthBtn = Auth(Btn),            AuthBtnLike = Auth(BtnLike);        return (            
logo

Welcome to React

To get started1, edit src/App.js and save to reload.

); }}export default App;
// 高阶组件 Auth.js/** * Created by Rayr Lee on 2017/11/19. */import React from 'react';var isLogin = false;// 控制能否登录 window.isLogin = isLogin;// Props Proxy (PP) 的最简实现:// function ppHOC(WrappedComponent) {  //     return class PP extends React.Component {    //       render() {      //         return 
// } // } // }export default function (ComposedComponent) { return class extends React.Component { tips() { alert('请登录'); } render() { return ( isLogin ?
: ) } }}

参考

  • [为什么React和Immutable是好朋友](

)

转载地址:http://mhtba.baihongyu.com/

你可能感兴趣的文章
.Net主线程扑捉子线程中的异常
查看>>
图解SQL的inner join、left join、right join、full outer join、union、union all的区别
查看>>
VBA 打开excel
查看>>
leetcode之Remove Duplicates from Sorted List II
查看>>
JSP去空白行
查看>>
【216】◀▶ IDL 字符串操作说明 (黑底)
查看>>
【326】PIL 截图及图片识别
查看>>
jquery中odd和even选择器的用法说明
查看>>
axios 拦截 , 页面跳转, token 验证
查看>>
Windows XP硬盘安装Ubuntu 12.04双系统图文详解
查看>>
Last Position of Target
查看>>
和我一起来学iOS(一)ObjectC的语法
查看>>
php_bu
查看>>
一轮项目冲刺3
查看>>
DDL语句--改动表
查看>>
javaEE之------ApectJ的切面技术===标签
查看>>
js 获取昨天,今天和明天的年月日格式
查看>>
中枢理论3
查看>>
BootStrap使用
查看>>
关于svn上传.classpath等问题
查看>>